﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ERPStore.Web.Extensions;

using CloudSoft.Extensions;

using ERPStore.Extensions;

using ERPStore.Web.Html;

namespace ERPStore.Coupons.Services.Providers
{
	public class TransportCouponProvider : CouponProviderBase
	{
		public TransportCouponProvider()
		{

		}

		public override string Description
		{
			get
			{
				return "Gratuité des frais de transport";
			}
		}

		public override IList<ERPStore.Models.BrokenRule> ValidateUse(ERPStore.Models.OrderCart cart, ERPStore.Models.UserPrincipal principal)
		{
			var brokenRules = base.ValidateUse(cart, principal) ?? new List<ERPStore.Models.BrokenRule>();
			if (brokenRules.IsNotNullOrEmpty())
			{
				return brokenRules;
			}

			// Verification si un des produits ne possède pas un port forcé
			foreach (var item in cart.Items)
			{
				if (item.Product.Shipping.FixedPrice != 0)
				{
					brokenRules.AddBrokenRule("couponcode", string.Format("Le référence produit '{0}' possède des frais de transport fixes, ce bon de réduction ne peut pas être appliqué", item.Product.Code));
					break;
				}
			}

			if (Coupon.ItemCount.HasValue
				&& cart.ItemCount < Coupon.ItemCount.Value)
			{
				brokenRules.AddBrokenRule("couponcode", string.Format("Ce coupon n'est applicable qu'à partir de {0} produit(s) dans votre panier", Coupon.ItemCount.Value));
			}

			return brokenRules;
		}

		public override void ApplyDiscountTo(Models.CartDiscount cartDiscount, ERPStore.Models.OrderCart cart, ERPStore.Models.UserPrincipal principal)
		{
			ERPStore.Models.Price price = null;
			if (Coupon.CreditAmount.GetValueOrDefault(0) > 0)
			{
				price = new ERPStore.Models.Price(Math.Max(0, cart.ShippingFee.Amount - Coupon.CreditAmount.Value), cart.GetShippingTaxRate(principal));
			}
			else
			{
				price = new ERPStore.Models.Price(cart.ShippingFee.Amount, cart.GetShippingTaxRate(principal));
			}
			cartDiscount.Discount = price.Value;
			cartDiscount.DiscountWithTax = price.Value;
			cartDiscount.DiscountReason = Coupon.Description;
			cartDiscount.Code = Coupon.Code;
		}
	}
}
